require(['jquery'], function($) {
	var radius = 250; // radius
	var dtr = Math.PI / 180; // PI在数学方法中为π,而此时的π在角度里为180°,Math.PI/180就为1°
	var d = 300;
	var mcList = []; // 所有台号高度和宽度
	var active = false;
	var lasta = 1;
	var lastb = 1;
	var distr = true;
	var tspeed = 10;
	var size = 200;

	var mouseX = 0;
	var mouseY = 0;

	var howElliptical = 1;

	var aA = null;
	var oDiv = null;

	var mouseX = 0;
	var mouseY = 0;
	$(function() {
		var i = 0;
		var oTag = null;
		var urls = {
			getData: "index/getTaiData",
			getLuck: "index/getAllLuck",
			getLuckTai: "index/getLuckTai"
		};

		$.post(urls.getData, function(rs) {
			var zone = $("#div1");
			var html = "";
			$.each(rs, function(index, item) {
				html += "<a href='' target='_blank'>" + item.taiHao; +
				"</a>";
			});
			zone.append(html);
			lrtk();
			mouseX += Math.random();
			mouseY += Math.random();
			setInterval(update2, 30);
		});

		var existLuckTaiStr = "";
		var taiCount = 0;
		var stopTaiBtn = $("#stopTaiBtn").unbind().bind("click", function() {
			// mouseX = 0;
			// mouseY = 0;
			// clearInterval(update2);

			var luckTotal = $("#luckTotal").val();
			$("#luckTotal").text("可抽台号次数" + taiCount);
			if("" == luckTotal) {
				alert("输入中奖台数量");
				return;
			}
			if(luckTotal == taiCount) {
				alert("已没有台数抽奖次数");
				$("#luckTotal").attr("disabled", "disabled");
				return;
			}
			$.post(urls.getLuckTai, {
				"existLuckTaiStr": existLuckTaiStr,
				"luckTotal": luckTotal
			}, function(rs) {
				taiCount++;
				existLuckTaiStr += rs.taiHao + ",";
				animate(taiCount, rs.taiHao);
				var empLuckLinkBtn = $("#empLuckLinkBtn");
				if(existLuckTaiStr != "") {
					empLuckLinkBtn.show();
				}
			});
		});
		var posL1 = 250;
		var posL2 = 250;

		function animate(taiCount, taiHao) {
			var zone = $("#rsTaiZone");
			var html = "<div id=" + taiHao + " style='display:inline-block;position:absolute;'>" + taiHao + "</div>";
			$(html).css({
				"font-size": "40px",
				"width": "40px",
				"height": "40px"
			});
			zone.append(html);
			if(taiCount <= 10) {
				$("#rsTaiZone" + " #" + taiHao).animate({
					top: '230px',
				}, 'slow');
				posL1 = posL1 - 50;
				$("#rsTaiZone" + " #" + taiHao).animate({
					right: posL1 + 'px',
					fontSize: "40px",
				}, 'slow');
			} else {
				$("#rsTaiZone" + " #" + taiHao).animate({
					top: '280px',
				}, 'slow');
				posL2 = posL2 - 50;
				$("#rsTaiZone" + " #" + taiHao).animate({
					right: posL2 + 'px',
					fontSize: "40px",
				}, 'slow');
			}
		}
		// TODO
		var empLuckLinkBtn = $("#empLuckLinkBtn").unbind().bind("click", function() {
			var arr = existLuckTaiStr.split(",");
			for(var i = 0; i < arr.length; i++) {
				$("#rsTaiZone" + " #" + arr[i]).animate({
					right: '1000px',
					fontSize: "40px",
				}, 'slow');
			}
		});

	});

	function lrtk() {
		oDiv = document.getElementById('div1');
		aA = oDiv.getElementsByTagName('a');

		for(i = 0; i < aA.length; i++) {
			oTag = {};
			// 是对象的可见宽高度，包滚动条等边线，会随窗口的显示大小改变
			oTag.offsetWidth = aA[i].offsetWidth;
			oTag.offsetHeight = aA[i].offsetHeight;
			mcList.push(oTag);
		}
		sineCosine(0, 0, 0);
		positionAll();
	}

	function start(a, b) {
		mouseX += Math.random();
		mouseY += Math.random();
		setInterval(update2, 30);
	}

	function stop(a, b) {
		mouseX = a;
		mouseY = b;
		clearInterval(update2);
	}

	function update2() {
		var a = mouseX;
		var b = mouseY;

		tspeed = 1;

		lasta = mouseX * tspeed;
		lastb = mouseY * tspeed;

		// console.log(lasta, lastb);

		if(Math.abs(a) <= 0.01 && Math.abs(b) <= 0.01) {
			return;
		}

		var c = 0;
		sineCosine(a, b, c);
		for(var j = 0; j < mcList.length; j++) {
			var rx1 = mcList[j].cx;
			var ry1 = mcList[j].cy * ca + mcList[j].cz * (-sa);
			var rz1 = mcList[j].cy * sa + mcList[j].cz * ca;

			var rx2 = rx1 * cb + rz1 * sb;
			var ry2 = ry1;
			var rz2 = rx1 * (-sb) + rz1 * cb;

			var rx3 = rx2 * cc + ry2 * (-sc);
			var ry3 = rx2 * sc + ry2 * cc;
			var rz3 = rz2;

			mcList[j].cx = rx3;
			mcList[j].cy = ry3;
			mcList[j].cz = rz3;

			per = d / (d + rz3);

			mcList[j].x = (howElliptical * rx3 * per) - (howElliptical * 2);
			mcList[j].y = ry3 * per;
			mcList[j].scale = per;
			mcList[j].alpha = per;

			mcList[j].alpha = (mcList[j].alpha - 0.6) * (10 / 6);
		}

		doPosition();
		depthSort();
	}

	function update() {
		var a;
		var b;

		if(active) {
			a = (-Math.min(Math.max(-mouseY, -size), size) / radius) * tspeed;
			b = (Math.min(Math.max(-mouseX, -size), size) / radius) * tspeed;
		} else {
			a = lasta * 0.98;
			b = lastb * 0.98;
		}

		lasta = a;
		lastb = b;
		tspeed = 1.3;
		lasta = 2.4 * tspeed;
		lastb = -2.3 * tspeed;
		console.log(lasta, lastb);

		if(Math.abs(a) <= 0.01 && Math.abs(b) <= 0.01) {
			return;
		}

		var c = 0;
		sineCosine(a, b, c);
		for(var j = 0; j < mcList.length; j++) {
			var rx1 = mcList[j].cx;
			var ry1 = mcList[j].cy * ca + mcList[j].cz * (-sa);
			var rz1 = mcList[j].cy * sa + mcList[j].cz * ca;

			var rx2 = rx1 * cb + rz1 * sb;
			var ry2 = ry1;
			var rz2 = rx1 * (-sb) + rz1 * cb;

			var rx3 = rx2 * cc + ry2 * (-sc);
			var ry3 = rx2 * sc + ry2 * cc;
			var rz3 = rz2;

			mcList[j].cx = rx3;
			mcList[j].cy = ry3;
			mcList[j].cz = rz3;

			per = d / (d + rz3);

			mcList[j].x = (howElliptical * rx3 * per) - (howElliptical * 2);
			mcList[j].y = ry3 * per;
			mcList[j].scale = per;
			mcList[j].alpha = per;

			mcList[j].alpha = (mcList[j].alpha - 0.6) * (10 / 6);
		}

		doPosition();
		depthSort();
	}

	function depthSort() {
		var i = 0;
		var aTmp = [];

		for(i = 0; i < aA.length; i++) {
			aTmp.push(aA[i]);
		}

		aTmp.sort(
			function(vItem1, vItem2) {
				if(vItem1.cz > vItem2.cz) {
					return -1;
				} else if(vItem1.cz < vItem2.cz) {
					return 1;
				} else {
					return 0;
				}
			}
		);

		for(i = 0; i < aTmp.length; i++) {
			aTmp[i].style.zIndex = i;
		}
	}

	// mcListλ�ã��ʹ�С
	function positionAll() {
		var phi = 0;
		var theta = 0;
		var max = mcList.length;
		var i = 0;

		var aTmp = [];
		// https://developer.mozilla.org/zh-CN/docs/Web/API/Document/createDocumentFragment
		// 创建的DOM元素插入到文档片段中因为文档片段存在与内存中，并不在DOM树中，所以将子元素插入到文档片段时不会引起页面回流(reflow)(对元素位置和几何上的计算)
		var oFragment = document.createDocumentFragment();

		// �������
		for(i = 0; i < aA.length; i++) {
			aTmp.push(aA[i]);
		}
		aTmp.sort(
			function() {
				return Math.random() < 0.5 ? 1 : -1;
			}
		);
		for(i = 0; i < aTmp.length; i++) {
			oFragment.appendChild(aTmp[i]);
		}
		oDiv.appendChild(oFragment);

		for(var i = 1; i < max + 1; i++) {
			if(distr) {
				phi = Math.acos(-1 + (2 * i - 1) / max); // ������ֵ
				theta = Math.sqrt(max * Math.PI) * phi; // ƽ����
			} else {
				phi = Math.random() * (Math.PI);
				theta = Math.random() * (2 * Math.PI);
			}
			// ����任
			mcList[i - 1].cx = radius * Math.cos(theta) * Math.sin(phi);
			mcList[i - 1].cy = radius * Math.sin(theta) * Math.sin(phi);
			mcList[i - 1].cz = radius * Math.cos(phi);

			aA[i - 1].style.left = mcList[i - 1].cx + oDiv.offsetWidth / 2 - mcList[i - 1].offsetWidth / 2 + 'px';
			aA[i - 1].style.top = mcList[i - 1].cy + oDiv.offsetHeight / 2 - mcList[i - 1].offsetHeight / 2 + 'px';
		}
	}

	function doPosition() {
		var l = oDiv.offsetWidth / 2;
		var t = oDiv.offsetHeight / 2;
		for(var i = 0; i < mcList.length; i++) {
			aA[i].style.left = mcList[i].cx + l - mcList[i].offsetWidth / 2 + 'px';
			aA[i].style.top = mcList[i].cy + t - mcList[i].offsetHeight / 2 + 'px';

			aA[i].style.fontSize = Math.ceil(12 * mcList[i].scale / 2) + 8 + 'px';

			aA[i].style.filter = "alpha(opacity=" + 100 * mcList[i].alpha + ")";
			aA[i].style.opacity = mcList[i].alpha;
		}
	}

	// Math.sin(x) x 的正玄值。返回值在 -1.0 到 1.0 之间；
	// Math.cos(x) x 的余弦值。返回的是 -1.0 到 1.0 之间的数；
	// 这两个函数中的X 都是指的“弧度”而非“角度”，弧度的计算公式为： 2*PI/360*角度；
	// 30° 角度 的弧度 = 2*PI/360*30
	function sineCosine(a, b, c) {
		sa = Math.sin(a * dtr);
		ca = Math.cos(a * dtr);
		sb = Math.sin(b * dtr);
		cb = Math.cos(b * dtr);
		sc = Math.sin(c * dtr);
		cc = Math.cos(c * dtr);
	}
});